package com.lwc;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

//生产者  向mq 投递消息
public class Productor {
    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
//1创建连接工厂  设置连接信息
        ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.81.128");//连接主机
factory.setUsername("root");//默认是guest
 factory.setPassword("root");//默认是guest
factory.setPort(5672);//连接端口号
factory.setVirtualHost("erp");//虚拟主机

        //2用连接工厂创建连接
        Connection conn=factory.newConnection();

        //3创建信道
        Channel channel=conn.createChannel();
      //4.路由键交换正常
        String normalEx="normal-ex";
        channel.exchangeDeclare(normalEx, BuiltinExchangeType.DIRECT);
        //4.声明死信的交换机
        String deadEx="dead-ex";
            channel.exchangeDeclare(deadEx, BuiltinExchangeType.DIRECT);

        //5.声明正常队列
        String queueName="queue-normal";
/**
 * queue 队列名称
 * durable 是否持久化
 *  exclusive是否独占队列   为true 信道必须是同一连接创建的
 *autodelete  是否自动删除    前提队列中灭有消息
 *arguments 向队列传递的其他参数
 *
 */

        Map<String,Object> map=new HashMap<>();
        map.put("x-dead-letter-exchange","dead-ex");//制定死信交换器
       // map.put("x-dead-letter-touting-key","dead"); //绑定死信路由键

channel.queueDeclare(queueName,true,false,false,map);
//5.2声明死信的队列
        String sixinname="queue-dead";
        channel.queueDeclare(sixinname,true,false,false,null);



//6.绑定交换器和队列
        //第一个 队列   第二个路由键  第三个 路由键名称
        channel.queueBind(queueName,normalEx,"normal");

        //6.绑定死信交换器和死信队列
        channel.queueBind(sixinname,deadEx,"normal");
        //7.发布消息
        //设置有限期
        AMQP.BasicProperties propertie1=new AMQP.BasicProperties()
                .builder()
                        .expiration("5000")
                                .build();
        channel.basicPublish(normalEx,"normal",propertie1,"测试5s数据".getBytes());
        //7.发布消息
        //设置有限期
        AMQP.BasicProperties properties2=new AMQP.BasicProperties()
                .builder()
                .expiration("10000")
                .build();
        channel.basicPublish(normalEx,"normal",properties2,"测试10s数据".getBytes());

        System.out.println("消息已发送");
        //8.释放资源
        channel.close();
        conn.close();

    }
}
